package main

import "fmt"

func main() {
	arr := []int{1, 2, 3, 4, 5, 6, 7, 8}
	s1 := arr[2:5]                                  // 此时切片的长度为3， 容量为6
	s2 := s1[2:4]                                   //  因为s1容量为6，所以4仍然属于合法的index
	fmt.Println(len(s1), cap(s1), len(s2), cap(s2)) // 输出：3 6 2 4
	fmt.Println(s1, s2)                             // 又因为未发生扩容行为，所以s1，s2公用底层数组， 故最后输出[3 4 5] [5 6]
	fmt.Println(arr[8:])

	s := []int{2}
	fmt.Println(s[1:]) //输出结果是 []，因为对于原切片可以[len:]这样切，但是一定不可以[len+1:] 因为len=1,[len:] =>切一个len到len的切片，等于空切片
	fmt.Println(len(s), cap(s))

	arr = []int{1, 2, 3, 4, 5, 6, 7, 8}
	s1 = arr[1:5:6] //当切片append时超出最大容量时，会自动扩容一倍，也就是 cap * 2
	fmt.Println(len(s1), cap(s1))
	fmt.Println(s1[3:5])
	s1 = append(s1, 999)
	fmt.Println(s1, arr)

	a := []int{1, 2, 3, 4, 5}
	b := a[0:2]
	c := a[0:3:3]
	b = append(b, 1)
	c = append(c, 1)

	fmt.Println("b:", b, "cap", cap(b))
	fmt.Println("c:", c, "cap", cap(c))
	fmt.Println("a:", a, "cap", cap(a))
	fmt.Println("c:", c[0:6])
	/*
		b: [1 2 1] cap 5  因为b的容量仍然是5，所以不会发生扩容
		c: [1 2 1 1] cap 6	因为c的容量是3，append的时候添加了一个新的元素，导致放不下需要扩容，所以会在底层重新创建一个比cap一倍大的数组然后把内容复制过来后在append，然后切片指向新数组
		a: [1 2 1 4 5] cap 5 因为c扩容后重新指向了新数组，所以这里除了被b修改了一个元素，其他不变
	*/
}
